import axios from 'axios';
import router from '@/router';
import { ElMessage } from 'element-plus';

const { VITE_API_BASE_URL, VITE_APP_ENV } = import.meta.env;
const isDev = VITE_APP_ENV === 'development';

// 错误码映射表
const ERROR_MESSAGES = {
  400: '请求参数错误',
  401: '未授权，请登录',
  403: '拒绝访问',
  404: '请求地址出错',
  408: '请求超时',
  500: '服务器内部错误',
  501: '服务未实现',
  502: '网关错误',
  503: '服务不可用',
  504: '网关超时',
};

// 创建axios实例
const service = axios.create({
  baseURL: VITE_API_BASE_URL || '/api',
  timeout: 15000,
  headers: {
    'Content-Type': 'application/json',
  },
  // 允许跨域携带cookie
  withCredentials: true,
});

// 请求重试配置
service.defaults.retry = 2; // 重试次数
service.defaults.retryDelay = 1000; // 重试延迟
service.defaults.shouldRetry = (error) => {
  // 判断是否需要重试
  return error.config.method === 'get';
};

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    isDev && console.error('Request error:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const { data, config } = response;
    
    // 处理自定义状态码
    if (data.code !== 200) {
      const errorMsg = data.message || '未知错误';
      ElMessage.error(errorMsg);
      
      // 特殊状态码处理
      switch (data.code) {
        case 401:
          handleUnauthorized();
          break;
        case 403:
          router.push('/403');
          break;
        // 可以添加其他状态码处理
      }
      
      return Promise.reject(new Error(errorMsg));
    }
    
    return data;
  },
  async (error) => {
    if (error.config && error.config.shouldRetry) {
      // 实现请求重试机制
      error.config.__retryCount = error.config.__retryCount || 0;
      
      if (error.config.__retryCount < service.defaults.retry) {
        error.config.__retryCount += 1;
        await new Promise(resolve => setTimeout(resolve, service.defaults.retryDelay));
        return service(error.config);
      }
    }

    const status = error.response?.status;
    const errorMsg = ERROR_MESSAGES[status] || error.message || '未知错误';
    
    // 显示错误提示
    ElMessage.error(errorMsg);
    
    // 错误日志记录
    isDev && console.error('Response error:', error);

    // 特殊状态码处理
    switch (status) {
      case 401:
        handleUnauthorized();
        break;
      case 403:
        router.push('/403');
        break;
      case 404:
        router.push('/404');
        break;
    }

    return Promise.reject(error);
  }
);

// 统一处理未授权情况
const handleUnauthorized = () => {
  localStorage.removeItem('token');
  router.push({
    path: '/login',
    query: { redirect: router.currentRoute.value.fullPath }
  });
};

export default service;